package com.szwistar.common.datastruct;

/**
 * 可被 JSON 化 ORM 的数据类型接口
 * <p>一个字段从数据库中加载（见 {@link JsonlizedOrmTypeHelper#parseJson(Class, String)}） 时，解析的过程如下：
 * <li> 尝试调用实现类的静态方法: {@link #parseJson(String)}
 * <li> 尝试调用构造函数: JsonableType(String json)
 * <li> 使用无参数构造函数创建对象，并调用 {@link #fromJson(String)} 方法
 * @see {@link JsonFieldPersister} 可以用来序列化简单类型的字段
 */
public interface JsonableType {
	/**
	 * 以 JSON 字符串为参数的构造函数
	 */
	//JsonableType(String json);

	/**
	 * 把获取内存逻辑对象的持久化 JSON 表达
	 * @return JSON 格式的数据
	 */
	String toJson() throws Exception;

	/**
	 * 设置 JSON 表达式的值（但实际上并未转化为内存对象，需要调用 resolveJson() 之后才真正变为有意义的内存对象）
	 * 注意：派生类必须重载此函数！！！
	 * @param json JSON 格式的数据
	 */
	void fromJson(String json) throws Exception;

	/**
	 * 把 JSON 数据解析为内存逻辑对象
	 * ！！！注意：此方法仅应在 json 所引用的对象都存在时，再进行调用，否则会导致因找不到对象而无法建立正确的引用！！！
	 * @param issues 解析过程中发现的问题列表
	 * @return 是否解析成功
	 */
	void resolveJson() throws Exception;

	/**
	 * 从 JSON 表达式中解析并创建 Java 对象
	 * @param json JSON 格式的数据
	 */
	//public static Object parseJson(String json) throws Exception;
}
